package com.atguigu.Util;

import com.atguigu.bean.TableProcess;
import com.google.common.base.CaseFormat;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author hjy
 * @create 2023/3/8 21:08
 */
public class JdbcUtil {
    /*
    这个工具类主要用来调用各种JDBC连接
    需要传进来的：一个连接     一个sql查询语句   一个需要返回的类型  是否要改变数据命名类型的值
    sql查询到的结果只会有四种类型    单行单列    单行多列
                                  多行单列    多行多列
    我们只需要考虑多行多列的情况，这样单行或者单列都只是多行多列中的一种情况

    返回的应该是一个list<>-->存储的是行
                    泛型中存储的是列  由于列的个数，类型不确定，可以传一个JSONObject或者一个JavaBean
                    所以这里使用一个泛型方法来实现返回值类型的不确定
    传入是否需要改变数据命名格式是因为在不同的数据库读取的数据，以及传入idea中数据的格式标准大都不同，所以要改变
     */
    public static <T> List<T> getJdbcUtil(Connection connection, String sql, Class<T> clz, Boolean type) throws Exception {
        ArrayList<T> valueList = new ArrayList<T>();

        //预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //执行
        ResultSet resultSet = preparedStatement.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        //拿到每一行
        while (resultSet.next()) {
            //将每一行封装为T对象
            T t = clz.newInstance();
            for (int i = 0; i < columnCount; i++) {
                String columnName = metaData.getColumnName(i + 1);
                Object value = resultSet.getObject(columnName);
                //判断是否需要修改数据
                if (type) {
                    columnName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName.toLowerCase());
                }
                BeanUtils.setProperty(t, columnName, value);
            }
            valueList.add(t);
        }


        return valueList;
    }



    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:mysql://hadoop102:3306/gmall__aconfig?" +
                "user=root&password=123456&useUnicode=true&" +
                "characterEncoding=utf8&serverTimeZone=Asia/Shanghai&useSSL=false");
        List<TableProcess> jdbcUtil = getJdbcUtil(conn, "select * from table_process", TableProcess.class, true);

        for (TableProcess tableProcess : jdbcUtil) {
            System.out.println(tableProcess);
        }
        conn.close();
    }
}
